const util = {
  /**
   * 防抖函数
   * @param {Function} fn 需要防抖的函数
   * @param {Number} delay 延迟时间（毫秒）
   * @return {Function} 防抖处理后的函数
   */
  debounce(fn, delay = 300) {
    let timer = null;
    return function(...args) {
      if (timer) clearTimeout(timer);
      timer = setTimeout(() => {
        fn.apply(this, args);
      }, delay);
    };
  },

  /**
   * 节流函数
   * @param {Function} fn 需要节流的函数
   * @param {Number} interval 间隔时间（毫秒）
   * @return {Function} 节流处理后的函数
   */
  throttle(fn, interval = 300) {
    let last = 0;
    return function(...args) {
      const now = Date.now();
      if (now - last >= interval) {
        last = now;
        fn.apply(this, args);
      }
    };
  },

  /**
   * 时间格式化
   * @param {Date|Number|String} date 日期对象、时间戳或日期字符串
   * @param {String} format 格式化模板，如 'YYYY-MM-DD HH:mm:ss'
   * @return {String} 格式化后的日期字符串
   */
  formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
    date = new Date(date);
    if (!(date instanceof Date) || isNaN(date)) {
      return '';
    }

    const map = {
      YYYY: date.getFullYear(),
      MM: date.getMonth() + 1,
      DD: date.getDate(),
      HH: date.getHours(),
      mm: date.getMinutes(),
      ss: date.getSeconds()
    };

    return format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, (match) => {
      const val = map[match];
      return val < 10 ? `0${val}` : `${val}`;
    });
  },

  /**
   * 深拷贝
   * @param {*} obj 需要深拷贝的对象
   * @return {*} 深拷贝后的对象
   */
  deepClone(obj) {
    if (obj === null || typeof obj !== 'object') {
      return obj;
    }
    const result = Array.isArray(obj) ? [] : {};
    for (const key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        result[key] = this.deepClone(obj[key]);
      }
    }
    return result;
  },

  /**
   * 获取URL参数
   * @param {String} name 参数名
   * @param {String} url URL字符串，默认为当前页面URL
   * @return {String|null} 参数值
   */
  getUrlParam(name, url = window.location.href) {
    const reg = new RegExp('[?&]' + name + '=([^&#]*)', 'i');
    const match = url.match(reg);
    return match ? decodeURIComponent(match[1]) : null;
  },

  /**
   * 随机生成指定长度的字符串
   * @param {Number} length 字符串长度
   * @return {String} 随机字符串
   */
  randomString(length = 8) {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let result = '';
    for (let i = 0; i < length; i++) {
      result += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return result;
  },

  /**
   * 数组去重
   * @param {Array} arr 原数组
   * @return {Array} 去重后的数组
   */
  uniqueArray(arr) {
    return [...new Set(arr)];
  }
};

export default util
